home *** CD-ROM | disk | FTP | other *** search
- /*
- * From netlib archives: netlib@ornl.gov
- */
-
- #include <stdio.h>
- #include <math.h>
-
- /*
- * Hue conversion table
- *
- * Computed from the FMC-1 color difference formula, Barco monitor
- * max(r,g,b)=1, n=61 magenta, 2 Jan 1986
- */
- double huettab[61] = {
- 0.0000, 0.0062, 0.0130, 0.0202, 0.0280,
- 0.0365, 0.0457, 0.0559, 0.0671, 0.0796,
- 0.0936, 0.1095, 0.1275, 0.1482, 0.1806,
- 0.2113, 0.2393, 0.2652, 0.2892, 0.3119,
- 0.3333, 0.3556, 0.3815, 0.4129, 0.4526,
- 0.5060, 0.5296, 0.5501, 0.5679, 0.5834,
- 0.5970, 0.6088, 0.6191, 0.6281, 0.6361,
- 0.6430, 0.6490, 0.6544, 0.6590, 0.6631,
- 0.6667, 0.6713, 0.6763, 0.6815, 0.6873,
- 0.6937, 0.7009, 0.7092, 0.7190, 0.7308,
- 0.7452, 0.7631, 0.7856, 0.8142, 0.8621,
- 0.9029, 0.9344, 0.9580, 0.9755, 0.9889,
- 1.0000
- };
-
- /*
- * This routine computes colors suitable for use in color level plots.
- * Typically s=v=1 and h varies from 0 (red) to 1 (blue) in
- * equally spaced steps. (h=.5 gives green; 1<h<1.5 gives magenta.)
- * To convert for frame buffer, use R = floor(255.999*pow(*r,1/gamma))
- * etc.
- */
- double
- rainbow( double h, double s, double v,
- double *r, double *g, double *b ) {
-
- int i;
- double modf(double, *double);
- double trash;
-
- h = 60*modf( h / 1.5, &trash );
- i = floor( h );
- h = huettab[i] + ( huettab[i+1] - huettab[i] ) * ( h - i );
- hsv2rgb( h, s, v, r, g, b );
- }
-
- /*
- * This routine does the actual conversion.
- * Here, h=.667 gives blue, h=0 or 1 gives red.
- * See Alvy Ray Smith, Color Gamut Transform Pairs, SIGGRAPH '78
- */
-
- void
- hsv2rgb( double h, double s, double v,
- double *r, double *g, double *b ) {
-
- int i;
- double f, m, n, k;
- double modf(double, *double);
- double trash;
-
- h = 6*modf(h,&trash);
- i = floor(h);
- f = h-i;
- m = (1-s);
- n = (1-s*f);
- k = (1-(s*(1-f)));
- switch(i){
- case 0: *r=1; *g=k; *b=m; break;
- case 1: *r=n; *g=1; *b=m; break;
- case 2: *r=m; *g=1; *b=k; break;
- case 3: *r=m; *g=n; *b=1; break;
- case 4: *r=k; *g=m; *b=1; break;
- case 5: *r=1; *g=m; *b=n; break;
- default:
- fprintf( stderr,"hsv2rgb: bad i: %f %d",
- h, i );
- exit( 1 );
- break;
- }
- f = *r;
- f = ( f < *g ) ? *g : f;
- f = ( f < *b ) ? *b : f;
- f = v / f;
- *r *= f;
- *g *= f;
- *b *= f;
- }
-
-
-